www.gusucode.com > 基于matlab编程空间复用空时码的仿真程序源码 > 基于matlab编程空间复用空时码的仿真程序源码/2Tx,2Rx,Spatial Multiplex/chanSUI_corr_2x2.m

    function chanSUI_corr_2x2(chanparams)
% SUI channel simulation with 2X2 antenna configuration
% chanparams.chantype -- SUI channel type
% chanparams.cohtime -- expanding length(number of sampling points per OFDM frame)
% chanparams.tx1_infile -- input data from Tx Antenna 1
% chanparams.tx2_infile -- input data from Tx Antenna 2
% chanparams.rx1_outfile -- channel output data at Rx Antenna 1
% chanparams.rx2_outfile -- channel output data at Rx Antenna 2
% chanparams.sampletime -- sample interval in time domain(1/Fs)
% chanparams.numframe -- Number of frames

switch chanparams.chantype,
    case 1,     % SUI-1 Channel
        tau = [0 0.4 0.9];      % tap delay in us
        load paths_sui1_11.mat;
        load paths_sui1_21.mat;
        load paths_sui1_12.mat;
        load paths_sui1_22.mat;
    case 2,     % SUI-2 Channel
        tau = [0 0.4 1.1];
        load paths_sui2_11.mat;
        load paths_sui2_21.mat;
        load paths_sui2_12.mat;
        load paths_sui2_22.mat;
    case 3,     % SUI-3 Channel
        tau = [0.0 0.4 0.9];
        load paths_sui3_11.mat;
        load paths_sui3_21.mat;
        load paths_sui3_12.mat;
        load paths_sui3_22.mat;
    case 4,     % SUI-4 Channel
        tau = [0 1.5 4];
        load paths_sui4_11.mat;
        load paths_sui4_21.mat;
        load paths_sui4_12.mat;
        load paths_sui4_22.mat;
    case 5,     % SUI-5 Channel
        tau = [0 4 10];
        load paths_sui5_11.mat;
        load paths_sui5_21.mat;
        load paths_sui5_12.mat;
        load paths_sui5_22.mat;
    case 6,     % SUI-6 Channel
        tau = [0 14 20];
        load paths_sui6_11.mat;
        load paths_sui6_21.mat;
        load paths_sui6_12.mat;
        load paths_sui6_22.mat;
    otherwise,
        error('Unrecognized channel model');
end

%-----------Read frame modulation data out--------
%-----------Note: frame modulation data are same in each frame.-------------
chanipfid_tx1 = fopen(chanparams.tx1_infile, 'r');      % open channel input from Tx Antenna 1 file
if chanipfid_tx1 <= 0
   error('unable to open Tx 1 channel input file');
end

[ChanInData_tx1, datalen] = fread(chanipfid_tx1, 2*chanparams.cohtime, 'float32');
if datalen~=2*chanparams.cohtime, error('fread Tx 1 channel input data error!'); end
ChanInData_tx1 =  [ 1 1j ] * reshape(ChanInData_tx1, 2, datalen/2);
Len = datalen/2;

fclose(chanipfid_tx1);

chanipfid_tx2 = fopen(chanparams.tx2_infile, 'r');      % open channel input from Tx Antenna 2 file
if chanipfid_tx2 <= 0
   error('unable to open Tx 2 channel input file');
end

[ChanInData_tx2, datalen] = fread(chanipfid_tx2, 2*chanparams.cohtime, 'float32');
if datalen~=2*chanparams.cohtime, frm,error('fread Tx 2 channel input data error!'); end
ChanInData_tx2 =  [ 1 1j ] * reshape(ChanInData_tx2, 2, datalen/2);
Len = datalen/2;

fclose(chanipfid_tx2);
%---------------------------------------------------------------------------

% Multipath process
Delay = round(tau/(chanparams.sampletime));       % multipath delay in sample points

% ########### Rx 1 Operation ##########
PrevFrame_tx1 = zeros(1,max(Delay));        % multipath delay part from previous frame
PrevFrame_tx2 = zeros(1,max(Delay));

chanopfid_rx1 = fopen(chanparams.rx1_outfile, 'w');     % open channel output to Rx Antenna 1 file
if chanopfid_rx1 < 0
   error('unable to open Rx 1 channel output file');
end

for frm = 1:chanparams.numframe     % let each frame pass through the channel
    % Tx 1 data through channel 11
    OutData_tx1 = zeros(1, Len);
    
    for p=1:3
        pathData_tx1 = [PrevFrame_tx1(end+1-Delay(p):end) ChanInData_tx1(1:end-Delay(p))];
        OutData_tx1 = OutData_tx1+pathData_tx1*paths_11(p,frm);
    end
    PrevFrame_tx1 = ChanInData_tx1(end+1-max(Delay):end);   % Not accurate! Just for convenience!
    
    % Tx 2 data through channel 21
    OutData_tx2 = zeros(1, Len);
    
    for p=1:3
        pathData_tx2 = [PrevFrame_tx2(end+1-Delay(p):end) ChanInData_tx2(1:end-Delay(p))];
        OutData_tx2 = OutData_tx2+pathData_tx2*paths_21(p,frm);
    end
    PrevFrame_tx2 = ChanInData_tx2(end+1-max(Delay):end);   % Not accurate! Just for convenience!
    
    % Superposition
    OutData = OutData_tx1+OutData_tx2;
    
% write each frame into file
fwrite(chanopfid_rx1, [real(OutData);imag(OutData)], 'float32');

end

% ########### Rx 2 Operation ##########
PrevFrame_tx1 = zeros(1,max(Delay));        % multipath delay part from previous frame
PrevFrame_tx2 = zeros(1,max(Delay));

chanopfid_rx2 = fopen(chanparams.rx2_outfile, 'w');     % open channel output to Rx Antenna 1 file
if chanopfid_rx2 < 0
   error('unable to open Rx 2 channel output file');
end

for frm = 1:chanparams.numframe     % let each frame pass through the channel
    % Tx 1 data through channel 11
    OutData_tx1 = zeros(1, Len);
    
    for p=1:3
        pathData_tx1 = [PrevFrame_tx1(end+1-Delay(p):end) ChanInData_tx1(1:end-Delay(p))];
        OutData_tx1 = OutData_tx1+pathData_tx1*paths_12(p,frm);
    end
    PrevFrame_tx1 = ChanInData_tx1(end+1-max(Delay):end);   % Not accurate! Just for convenience!
    
    % Tx 2 data through channel 21
    OutData_tx2 = zeros(1, Len);
    
    for p=1:3
        pathData_tx2 = [PrevFrame_tx2(end+1-Delay(p):end) ChanInData_tx2(1:end-Delay(p))];
        OutData_tx2 = OutData_tx2+pathData_tx2*paths_22(p,frm);
    end
    PrevFrame_tx2 = ChanInData_tx2(end+1-max(Delay):end);   % Not accurate! Just for convenience!
    
    % Superposition
    OutData = OutData_tx1+OutData_tx2;
    
% write each frame into file
fwrite(chanopfid_rx2, [real(OutData);imag(OutData)], 'float32');

end


fclose(chanopfid_rx1);
fclose(chanopfid_rx2);